昨天實作完新增跟刪除之後,我們之後要使用Chart這個框架來搭配SwiftData,所以我們今天要重新設計一個資料模型。
這邊是資料表的內容,今天的範例是設計用來儲存和管理食物相關資訊的資料結構。看到下面有個 enum 他遵循 CaseIterable 的協議,這個協議可以把這個 enum 當成一個 array 來做訪問。
@Model
class DataModel {
    var style: Style.RawValue
    
    var name: String
    var quantity: Int
    var calories: Int
    init(
        name: String,
        quantity: Int,
        calories: Int,
        style: Style
    ) {
        self.name = name
        self.quantity = quantity
        self.calories = calories
        self.style = style.rawValue
    }
    
    enum Style: String, CaseIterable {
        case fruit = "Fruit"
        case vegetable = "Vegetable"
        case snack = "Snack"
    }
}
這邊先包一個 NavigationStack,然後再出現的時候判斷資料庫裡面有沒有資料,如果沒有的話就把假資料新增到資料庫裡面。
struct ContentView: View {
    
    @Environment(\.modelContext) private var modelContext
    @Query private var datas: [DataModel]
    var body: some View {
        NavigationStack {
            List {
                ForEach(datas) { data in
                    Text(data.name)
                }
            }
        }
        .onAppear {
            if datas.isEmpty {
                initData()
            }
        }
    }
}
extension ContentView {
    
    func initData() {
        
        let data1 = DataModel(name: "Apple", quantity: 100, calories: 52, style: .fruit)
        let data2 = DataModel(name: "Banana", quantity: 100, calories: 89, style: .fruit)
        
        let data3 = DataModel(name: "Carrot", quantity: 100, calories: 41, style: .vegetable)
        let data4 = DataModel(name: "Broccoli", quantity: 100, calories: 34, style: .vegetable)
        
        let data5 = DataModel(name: "Potato Chips", quantity: 50, calories: 536, style: .snack)
        let data6 = DataModel(name: "Chocolate", quantity: 50, calories: 546, style: .snack)
        
        let dataModels: [DataModel] = [data1, data2, data3, data4, data5, data6]
        
        dataModels.forEach { data in
            modelContext.insert(data)
        }
    }
}
接下來我們將 NavigationStack 裡的程式碼改成以下,這樣點擊的時候就可以挑選食物的類型。
Picker("", selection: $style) {
    ForEach(DataModel.Style.allCases, id: \.self) { style in
        Text(style.rawValue)
            .tag(style.rawValue)
    }
}
.buttonStyle(.bordered)